{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "089abfb7",
   "metadata": {},
   "source": [
    "# Building Blocks of PyTorch\n",
    "\n",
    "First run the writer.py script and generate the MNIST training data in the ./output/ folder"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d8fd7272",
   "metadata": {},
   "source": [
    "#### System Imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "id": "dd05ac7e",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import numpy as np\n",
    "from torchvision import utils\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "18be7474",
   "metadata": {},
   "source": [
    "#### PyTorch Imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "id": "e8fad9a9",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "from torch import optim\n",
    "from torch.utils.data import Dataset\n",
    "from torchvision.io import read_image\n",
    "from torch.nn import functional as F\n",
    "from torchvision import transforms as T "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a0e963af",
   "metadata": {},
   "source": [
    "#### Loading MNIST Dataset using Custom Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "id": "fcb7dabc",
   "metadata": {},
   "outputs": [],
   "source": [
    "class CustomMNISTDataset(Dataset):\n",
    "\tdef __init__(self, dataset_path):\n",
    "\t\tself.dataset_path = dataset_path\n",
    "\t\tself.imgs, self.labels = [], []\n",
    "\t\tfor dirpath, _, filenames in os.walk(self.dataset_path):\n",
    "\t\t\tself.imgs.extend([f\"{dirpath}/{i}\" for i in filenames])\n",
    "\t\t\tself.labels.extend([f\"{dirpath.split('/')[-1]}\" for _ in filenames])\n",
    "\t\t#self.transform = T.Compose([T.Lambda(torch.flatten)])\n",
    "\t\tself.target_transform = T.Compose([T.Lambda(lambda x: torch.LongTensor([x])), T.Lambda(lambda x: F.one_hot(x, 10))])\n",
    "\n",
    "\tdef __len__(self):\n",
    "\t\t# Returns the Size of the Dataset\n",
    "\t\treturn len(self.imgs)\n",
    "\n",
    "\tdef __getitem__(self, idx):\n",
    "\t\t# Returns a Sample from the data\n",
    "\t\t# print(self.imgs[idx])\n",
    "\t\timage = read_image(self.imgs[idx])\n",
    "\t\tlabel = int(self.labels[idx]) # Converting String Label to Integer\n",
    "\t\t#image = self.transform(image)\n",
    "\t\timage = image / 255.0\n",
    "\t\tlabel = self.target_transform(label)\n",
    "\t\treturn image, label"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "id": "efcd3d43",
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch.utils.data import DataLoader\n",
    "\n",
    "train_dataloader = DataLoader(CustomMNISTDataset('./output/'),\n",
    "                              batch_size=64, shuffle=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8df7af0c",
   "metadata": {},
   "source": [
    "#### Single Sample from MNIST Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "id": "3873841a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "train_features, train_labels = next(iter(train_dataloader))\n",
    "img = train_features[0].squeeze()\n",
    "label = train_labels[0]\n",
    "plt.title(f\"Sample Image: Label->{label}\")\n",
    "plt.imshow(img.reshape(28,28), cmap=\"gray\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "id": "ad678500",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Feature batch shape: torch.Size([64, 1, 28, 28])\n",
      "Labels batch shape: torch.Size([64, 1, 10])\n"
     ]
    }
   ],
   "source": [
    "print(f\"Feature batch shape: {train_features.size()}\")\n",
    "print(f\"Labels batch shape: {train_labels.size()}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8fed589d",
   "metadata": {},
   "source": [
    "#### Simple Neural Network for Predicting Class of HandWritten Digits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 295,
   "id": "9cfada3d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch import nn\n",
    "from torch.nn import functional as F\n",
    "l = nn.Conv2d(in_channels=1, out_channels=10,\n",
    "                               kernel_size=5, padding=0)\n",
    "f = nn.MaxPool2d(3, stride=2)\n",
    "f2 = nn.Flatten()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 296,
   "id": "b163e862",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([64, 1210])"
      ]
     },
     "execution_count": 296,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#f2(l(train_features)).shape\n",
    "f2(f(l(train_features))).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 254,
   "id": "8361b5dc",
   "metadata": {},
   "outputs": [],
   "source": [
    "class ConvNet(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(ConvNet, self).__init__() #Initializing superclass\n",
    "        self.conv_layer = nn.Conv2d(in_channels=1, out_channels=10,\n",
    "                               kernel_size=28, padding=0)\n",
    "        self.relu = nn.ReLU()\n",
    "        self.flatten = nn.Flatten()\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = self.conv_layer(x)\n",
    "        x = self.relu(x)\n",
    "        x = self.flatten(x)\n",
    "        out = F.log_softmax(x, dim=1)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "14225387",
   "metadata": {},
   "source": [
    "### Training Loop in PyTorch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 268,
   "id": "f5e6cdc2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0: 2.222630739212036\n",
      "1: 2.0494024753570557\n",
      "2: 1.8831391334533691\n",
      "3: 1.7397220134735107\n",
      "4: 1.599270224571228\n",
      "5: 1.4667739868164062\n",
      "6: 1.3514480590820312\n",
      "7: 1.2509434223175049\n",
      "8: 1.1640762090682983\n",
      "9: 1.089267611503601\n",
      "10: 1.0245296955108643\n",
      "11: 0.9676914215087891\n",
      "12: 0.9178779721260071\n",
      "13: 0.8744063973426819\n",
      "14: 0.8364596366882324\n",
      "15: 0.8024967908859253\n",
      "16: 0.7725961804389954\n",
      "17: 0.7459172010421753\n",
      "18: 0.7218515872955322\n",
      "19: 0.7000105977058411\n",
      "20: 0.6803256869316101\n",
      "21: 0.6624153852462769\n",
      "22: 0.646346926689148\n",
      "23: 0.6313562393188477\n",
      "24: 0.617751955986023\n",
      "25: 0.6051700115203857\n",
      "26: 0.5935962200164795\n",
      "27: 0.582836925983429\n",
      "28: 0.5727808475494385\n",
      "29: 0.5635625720024109\n",
      "30: 0.5548183917999268\n",
      "31: 0.5466330051422119\n",
      "32: 0.5390300750732422\n",
      "33: 0.532080888748169\n",
      "34: 0.5251561403274536\n",
      "35: 0.5189392566680908\n",
      "36: 0.5127766132354736\n",
      "37: 0.5070438385009766\n",
      "38: 0.5018283724784851\n",
      "39: 0.49662721157073975\n",
      "40: 0.4917532503604889\n",
      "41: 0.48703885078430176\n",
      "42: 0.48260778188705444\n",
      "43: 0.47846081852912903\n",
      "44: 0.4743342697620392\n",
      "45: 0.4705313444137573\n",
      "46: 0.46677449345588684\n",
      "47: 0.46318525075912476\n",
      "48: 0.45986199378967285\n",
      "49: 0.4567224085330963\n"
     ]
    }
   ],
   "source": [
    "# Constants\n",
    "lr = 0.0025\n",
    "epochs = 50\n",
    "\n",
    "# Loading Dataset\n",
    "train_dataset = CustomMNISTDataset('./output/training/')\n",
    "train_dataloader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n",
    "\n",
    "# Initialize Model\n",
    "model = ConvNet()\n",
    "# Initialize Optimizer\n",
    "optimizer = optim.Adadelta(model.parameters(), lr=lr)\n",
    "# Loss function\n",
    "loss_fn = nn.CrossEntropyLoss()\n",
    "\n",
    "# set model to train mode\n",
    "losses = []\n",
    "model.train()\n",
    "for epoch in range(epochs):\n",
    "\tbatch_losses = []    \n",
    "\tfor batch_idx, (data, targets) in enumerate(train_dataloader):\n",
    "\t\toptimizer.zero_grad()\n",
    "\t\toutputs = model(data)\n",
    "\t\tloss = loss_fn(outputs, targets.squeeze(1).float())\n",
    "\t\tloss.backward() # Backpropagation of loss\n",
    "\t\toptimizer.step() # Updating Weights based on Gradients\n",
    "\t\tbatch_losses.append(loss.item())\n",
    "\tfinal_epoch_loss = torch.mean(torch.Tensor(batch_losses))\n",
    "\tlosses.append(final_epoch_loss)\n",
    "\tprint(f\"{epoch}: {final_epoch_loss}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2c4ac119",
   "metadata": {},
   "source": [
    "#### Plotting Training Loss and Epoch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 269,
   "id": "152696c0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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APGcN56JEyeK3t7eoo2Njejr6ytOnDhRTExMNGw35bkWRFEUG34diYiIiMh8cAwQERERWRwGICIiIrI4DEBERERkcRiAiIiIyOIwABEREZHFYQAiIiIii8MARERERBaHAYiIqA4EQcCWLVukLoOIGgkDEBE1e9OmTYMgCDWW4cOHS10aEZkpK6kLICKqi+HDh+Orr74yWqdQKCSqhojMHa8AEZFZUCgU8PLyMlqcnZ0BVHVPrVy5EiNGjICtrS1at26NH3/80Wj/s2fP4i9/+QtsbW3h6uqKmTNnorCw0KjNl19+iY4dO0KhUMDb2xuzZ8822p6dnY3x48fDzs4Obdq0wU8//WTaD01EJsMAREQtwuuvv44JEybg9OnTmDJlCiZNmoSLFy8CAIqKijBs2DA4Ozvj2LFj2LBhA3bv3m0UcFauXIno6GjMnDkTZ8+exU8//YSQkBCj91i8eDGeeOIJnDlzBiNHjsSUKVNw+/btJv2cRNRIGuWRqkREJhQVFSXK5XLR3t7eaHn77bdFUax6Qv3zzz9vtE94eLg4a9YsURRF8T//+Y/o7OwsFhYWGrb/8ssvokwmEzUajSiKoujj4yP+85//vGsNAMT/+7//M7wuLCwUAYjbt29vtM9JRE2HY4CIyCwMHjwYK1euNFrn4uJi+DkiIsJoW0REBBISEgAAFy9eRFhYGOzt7Q3b+/btC71ej8uXL0MQBKSlpWHIkCH3rKFz586Gn+3t7aFSqZCZmfmgH4mIJMQARERmwd7evkaXVGOxtbWtUztra2uj14IgQK/Xm6IkIjIxjgEiohbh8OHDNV63b98eANC+fXucPn0aRUVFhu0HDx6ETCZDaGgoHB0dERgYiNjY2CatmYikwytARGQWysrKoNFojNZZWVnBzc0NALBhwwb06NED/fr1w3fffYejR4/iiy++AABMmTIFixYtQlRUFN544w1kZWXhxRdfxNNPPw1PT08AwBtvvIHnn38eHh4eGDFiBAoKCnDw4EG8+OKLTftBiahJMAARkVnYsWMHvL29jdaFhobi0qVLAKpmaK1duxYvvPACvL298cMPP6BDhw4AADs7O/z22294+eWX0bNnT9jZ2WHChAn48MMPDceKiopCaWkpPvroI8yfPx9ubm547LHHmu4DElGTEkRRFKUugoioIQRBwObNmzFu3DipSyEiM8ExQERERGRxGICIiIjI4nAMEBGZPfbkE1F98QoQERERWRwGICIiIrI4DEBERERkcRiAiIiIyOIwABEREZHFYQAiIiIii8MARERERBaHAYiIiIgsDgMQERERWZz/B4wvPCqMRRhCAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"Training Loss vs Epoch\")\n",
    "plt.xlabel(\"Epoch\")\n",
    "plt.ylabel(\"Training Loss\")\n",
    "plt.plot(range(epochs), losses)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1622a99c",
   "metadata": {},
   "source": [
    "#### Calculating Accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 270,
   "id": "5fd4c189",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.8924\n"
     ]
    }
   ],
   "source": [
    "from collections import defaultdict\n",
    "\n",
    "# Load the test data\n",
    "test_dataset = CustomMNISTDataset('./output/testing/')\n",
    "test_dataloader = DataLoader(test_dataset, batch_size=64, shuffle=True)\n",
    "\n",
    "# Set model to eval mode\n",
    "model.eval()\n",
    "\n",
    "# Loop over dataset to compute accuracy\n",
    "correct = 0\n",
    "correct_dict = defaultdict(lambda: [0,0])\n",
    "for batch_idx, (data, targets) in enumerate(test_dataloader):\n",
    "    outputs = model(data)\n",
    "    pred = outputs.argmax(dim=1, keepdim=True) \n",
    "    correct += pred.eq(targets.argmax(dim=2).view_as(pred)).sum().item()\n",
    "    for p, t in zip(pred, targets):\n",
    "        if p[0] == t.argmax():\n",
    "            correct_dict[t.argmax().item()][0] += 1\n",
    "        correct_dict[t.argmax().item()][1] += 1\n",
    "accuracy = correct / test_dataset.__len__()\n",
    "print(f\"Accuracy: {accuracy}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 271,
   "id": "ee907732",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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lZVlNSWckZFRshcCoEwKDw9XeHj4Dc9t27YtT1vDhg2tvmb/Ox8fH8XFxeV73s/PT59//nmR6wRQMLsOO5GRkcrIyFBAQICcnJyUk5Oj6dOnKzQ0VJIsW0CLuj00Ojpar776askVDgAA7IZdr9l5//339d5772nVqlU6ePCgVqxYoTlz5mjFihW3Ne6ECROUnp5uOc6ePVtMFQMAAHtj1zM7L774oiIjIy1fRwUGBurMmTOKjo7WoEGDLFtAU1NT5evra3lfamqqWrRoke+4Li4ucnFxKdHaAQCAfbDrmZ3ff/+9wG2adevWlY+Pj9X20IyMDO3du/em20MBAMCdwa5ndkJCQjR9+nTVrl1bTZo00aFDhzR37lwNHTpUkuTg4KCxY8fqtddeU4MGDVS3bl1NnjxZfn5+6t27t22LBwAAdsGuw86CBQs0efJkPffcc7p48aL8/Pw0atQoTZkyxdLnpZdeUmZmpkaOHKm0tDTdd9992rhxo1xdXW1YOQAAsBd2HXY8PDwUExOjmJiYfPs4ODho6tSpeW7NDgD5qRP5ma1LyOPHmT1tXQJgWna9ZgcAAOB2EXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICp2X3YOXfunJ566il5eXnJzc1NgYGBOnDggOW8YRiaMmWKfH195ebmpuDgYJ04ccKGFQMAAHti12Hnt99+U8eOHVW+fHl98cUXOnr0qN544w1VqVLF0mf27NmaP3++Fi9erL1798rd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pUqVrA4AAGBOdv01VpcuXXT48GGrtiFDhiggIEDjx49XrVq1VL58eW3ZskV9+/aVJB07dkzJyclq3769LUoGAAB2xq7DjoeHh5o2bWrV5u7uLi8vL0v7sGHDFBERoapVq6pSpUp6/vnn1b59e9177722KBkAANgZuw47hTFv3jw5Ojqqb9++ysrKUrdu3fTmm2/auiwAAGAnylzY2bZtm9VrV1dXLVq0SIsWLbJNQQAAwK7Z9QJlAACA20XYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApmbXYSc6Olpt27aVh4eHatSood69e+vYsWNWfa5evaqwsDB5eXmpYsWK6tu3r1JTU21UMQAAsDd2HXa2b9+usLAw7dmzRwkJCcrOzlbXrl2VmZlp6TNu3Dh98skn+uCDD7R9+3adP39ejz76qA2rBgAA9qScrQsoyMaNG61ev/3226pRo4YSExPVqVMnpaena9myZVq1apUefPBBSVJcXJwaNWqkPXv26N5777VF2QAAwI7Y9czO36Wnp0uSqlatKklKTExUdna2goODLX0CAgJUu3Zt7d69O99xsrKylJGRYXUAAABzKjNhJzc3V2PHjlXHjh3VtGlTSVJKSoqcnZ3l6elp1dfb21spKSn5jhUdHa3KlStbjlq1apVk6QAAwIbKTNgJCwvTkSNHFB8ff9tjTZgwQenp6Zbj7NmzxVAhAACwR3a9Zue68PBwffrpp9qxY4fuuusuS7uPj4+uXbumtLQ0q9md1NRU+fj45Duei4uLXFxcSrJkAABgJ+x6ZscwDIWHh2vdunXaunWr6tata3W+devWKl++vLZs2WJpO3bsmJKTk9W+ffvSLhcAANghu57ZCQsL06pVq/Txxx/Lw8PDsg6ncuXKcnNzU+XKlTVs2DBFRESoatWqqlSpkp5//nm1b9+enVgAAECSnYed2NhYSVLnzp2t2uPi4jR48GBJ0rx58+To6Ki+ffsqKytL3bp105tvvlnKlQIAAHtl12HHMIyb9nF1ddWiRYu0aNGiUqgIAACUNXa9ZgcAAOB2EXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpEXYAAICpmSbsLFq0SHXq1JGrq6uCgoK0b98+W5cEAADsgCnCzpo1axQREaGoqCgdPHhQzZs3V7du3XTx4kVblwYAAGzMFGFn7ty5GjFihIYMGaLGjRtr8eLFqlChgpYvX27r0gAAgI2Vs3UBt+vatWtKTEzUhAkTLG2Ojo4KDg7W7t27b/ierKwsZWVlWV6np6dLkjIyMoq9vtys34t9zNtVmOuk7uJD3aWLuksXdZcuM9d9O+MahlFwR6OMO3funCHJ2LVrl1X7iy++aLRr1+6G74mKijIkcXBwcHBwcJjgOHv2bIFZoczP7NyKCRMmKCIiwvI6NzdXly5dkpeXlxwcHGxYWf4yMjJUq1YtnT17VpUqVbJ1OYVG3aWLuksXdZcu6i5dZaFuwzB0+fJl+fn5FdivzIedatWqycnJSampqVbtqamp8vHxueF7XFxc5OLiYtXm6elZUiUWq0qVKtntX7qCUHfpou7SRd2li7pLl73XXbly5Zv2KfMLlJ2dndW6dWtt2bLF0pabm6stW7aoffv2NqwMAADYgzI/syNJERERGjRokNq0aaN27dopJiZGmZmZGjJkiK1LAwAANmaKsNO/f3/9/PPPmjJlilJSUtSiRQtt3LhR3t7eti6t2Li4uCgqKirP12/2jrpLF3WXLuouXdRduspq3TfiYBg3268FAABQdpX5NTsAAAAFIewAAABTI+wAAABTI+wAAABTI+yUAYsWLVKdOnXk6uqqoKAg7du3z9Yl3dSOHTsUEhIiPz8/OTg4aP369bYu6aaio6PVtm1beXh4qEaNGurdu7eOHTtm67JuKjY2Vs2aNbPc+Kt9+/b64osvbF1Wkc2cOVMODg4aO3asrUsp0CuvvCIHBwerIyAgwNZlFcq5c+f01FNPycvLS25ubgoMDNSBAwdsXVaB6tSpk+fP28HBQWFhYbYurUA5OTmaPHmy6tatKzc3N9WvX1/Tpk27+TOc7MDly5c1duxY+fv7y83NTR06dND+/fttXdZtIezYuTVr1igiIkJRUVE6ePCgmjdvrm7duunixYu2Lq1AmZmZat68uRYtWmTrUgpt+/btCgsL0549e5SQkKDs7Gx17dpVmZmZti6tQHfddZdmzpypxMREHThwQA8++KB69eqlb7/91talFdr+/fv11ltvqVmzZrYupVCaNGmiCxcuWI6dO3fauqSb+u2339SxY0eVL19eX3zxhY4ePao33nhDVapUsXVpBdq/f7/Vn3VCQoIk6fHHH7dxZQWbNWuWYmNjtXDhQn333XeaNWuWZs+erQULFti6tJsaPny4EhIS9O677+rw4cPq2rWrgoODde7cOVuXduuK5WmcKDHt2rUzwsLCLK9zcnIMPz8/Izo62oZVFY0kY926dbYuo8guXrxoSDK2b99u61KKrEqVKsa///1vW5dRKJcvXzYaNGhgJCQkGA888IAxZswYW5dUoKioKKN58+a2LqPIxo8fb9x33322LuO2jRkzxqhfv76Rm5tr61IK1LNnT2Po0KFWbY8++qgRGhpqo4oK5/fffzecnJyMTz/91Kq9VatWxssvv2yjqm4fMzt27Nq1a0pMTFRwcLClzdHRUcHBwdq9e7cNK7szpKenS5KqVq1q40oKLycnR/Hx8crMzCwzj0sJCwtTz549rf6e27sTJ07Iz89P9erVU2hoqJKTk21d0k1t2LBBbdq00eOPP64aNWqoZcuWWrp0qa3LKpJr165p5cqVGjp0qN0+tPm6Dh06aMuWLTp+/Lgk6euvv9bOnTvVvXt3G1dWsP/973/KycmRq6urVbubm1uZmMHMjynuoGxWv/zyi3JycvLcCdrb21vff/+9jaq6M+Tm5mrs2LHq2LGjmjZtautyburw4cNq3769rl69qooVK2rdunVq3Lixrcu6qfj4eB08eLBMrQcICgrS22+/rYYNG+rChQt69dVXdf/99+vIkSPy8PCwdXn5On36tGJjYxUREaGJEydq//79Gj16tJydnTVo0CBbl1co69evV1pamgYPHmzrUm4qMjJSGRkZCggIkJOTk3JycjR9+nSFhobaurQCeXh4qH379po2bZoaNWokb29vrV69Wrt379bdd99t6/JuGWEHuIGwsDAdOXKkzPwm07BhQyUlJSk9PV0ffvihBg0apO3bt9t14Dl79qzGjBmjhISEPL9F2rO//mberFkzBQUFyd/fX++//76GDRtmw8oKlpubqzZt2mjGjBmSpJYtW+rIkSNavHhxmQk7y5YtU/fu3eXn52frUm7q/fff13vvvadVq1apSZMmSkpK0tixY+Xn52f3f97vvvuuhg4dqpo1a8rJyUmtWrXSgAEDlJiYaOvSbhlhx45Vq1ZNTk5OSk1NtWpPTU2Vj4+Pjaoyv/DwcH366afasWOH7rrrLluXUyjOzs6W37pat26t/fv361//+pfeeustG1eWv8TERF28eFGtWrWytOXk5GjHjh1auHChsrKy5OTkZMMKC8fT01P33HOPTp48aetSCuTr65sn/DZq1EgfffSRjSoqmjNnzmjz5s1au3atrUsplBdffFGRkZF64oknJEmBgYE6c+aMoqOj7T7s1K9fX9u3b1dmZqYyMjLk6+ur/v37q169erYu7ZaxZseOOTs7q3Xr1tqyZYulLTc3V1u2bCkz6zHKEsMwFB4ernXr1mnr1q2qW7eurUu6Zbm5ucrKyrJ1GQXq0qWLDh8+rKSkJMvRpk0bhYaGKikpqUwEHUm6cuWKTp06JV9fX1uXUqCOHTvmuZXC8ePH5e/vb6OKiiYuLk41atRQz549bV1Kofz+++9ydLT+Eevk5KTc3FwbVVR07u7u8vX11W+//aZNmzapV69eti7pljGzY+ciIiI0aNAgtWnTRu3atVNMTIwyMzM1ZMgQW5dWoCtXrlj9pvvDDz8oKSlJVatWVe3atW1YWf7CwsK0atUqffzxx/Lw8FBKSookqXLlynJzc7NxdfmbMGGCunfvrtq1a+vy5ctatWqVtm3bpk2bNtm6tAJ5eHjkWQ/l7u4uLy8vu14n9cILLygkJET+/v46f/68oqKi5OTkpAEDBti6tAKNGzdOHTp00IwZM9SvXz/t27dPS5Ys0ZIlS2xd2k3l5uYqLi5OgwYNUrlyZePHVkhIiKZPn67atWurSZMmOnTokObOnauhQ4faurSb2rRpkwzDUMOGDXXy5Em9+OKLCggIsPufOwWy9XYw3NyCBQuM2rVrG87Ozka7du2MPXv22Lqkm/rqq68MSXmOQYMG2bq0fN2oXklGXFycrUsr0NChQw1/f3/D2dnZqF69utGlSxfjyy+/tHVZt6QsbD3v37+/4evrazg7Oxs1a9Y0+vfvb5w8edLWZRXKJ598YjRt2tRwcXExAgICjCVLlti6pELZtGmTIck4duyYrUsptIyMDGPMmDFG7dq1DVdXV6NevXrGyy+/bGRlZdm6tJtas2aNUa9ePcPZ2dnw8fExwsLCjLS0NFuXdVscDKMM3M4RAADgFrFmBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphB0CZ5+DgoPXr19u6DAB2irADwO6lpKTo+eefV7169eTi4qJatWopJCTE6rlxAJCfsvGQEQB3rB9//FEdO3aUp6enXn/9dQUGBio7O1ubNm1SWFiYvv/+e1uXCMDOMbMDwK4999xzcnBw0L59+9S3b1/dc889atKkiSIiIrRnz54bvmf8+PG65557VKFCBdWrV0+TJ09Wdna25fzXX3+t//f//p88PDxUqVIltW7dWgcOHJAknTlzRiEhIapSpYrc3d3VpEkTff7556VyrQBKBjM7AOzWpUuXtHHjRk2fPl3u7u55znt6et7wfR4eHnr77bfl5+enw4cPa8SIEfLw8NBLL70kSQoNDVXLli0VGxsrJycnJSUlqXz58pKksLAwXbt2TTt27JC7u7uOHj2qihUrltg1Aih5hB0AduvkyZMyDEMBAQFFet+kSZMs/12nTh298MILio+Pt4Sd5ORkvfjii5ZxGzRoYOmfnJysvn37KjAwUJJUr169270MADbG11gA7JZhGLf0vjVr1qhjx47y8fFRxYoVNWnSJCUnJ1vOR0REaPjw4QoODtbMmTN16tQpy7nRo0frtddeU8eOHRUVFaVvvvnmtq8DgG0RdgDYrQYNGsjBwaFIi5B3796t0NBQ9ejRQ59++qkOHTqkl19+WdeuXbP0eeWVV/Ttt9+qZ8+e2rp1qxo3bqx169ZJkoYPH67Tp0/r6aef1uHDh9WmTRstWLCg2K8NQOlxMG71VycAKAXdu3fX4cOHdezYsTzrdtLS0uTp6SkHBwetW7dOvXv31htvvKE333zTarZm+PDh+vDDD5WWlnbDzxgwYIAyMzO1YcOGPOcmTJigzz77jBkeoAxjZgeAXVu0aJFycnLUrl07ffTRRzpx4oS+++47zZ8/X+3bt8/Tv0GDBkpOTlZ8fLxOnTql+fPnW2ZtJOmPP/5QeHi4tm3bpjNnzui///2v9u/fr0aNGkmSxo4dq02bNumHH37QwYMH9dVXX1nOASibWKAMwK7Vq1dPBw8e1PTp0/XPf/5TFy5cUPXq1dW6dWvFxsbm6f/II49o3LhxCg8PV1ZWlnr27KnJkyfrlVdekSQ5OTnp119/1cCBA5Wamqpq1arp0Ucf1auvvipJysnJUVhYmH766SdVqlRJDz/8sObNm1ealwygmPE1FgAAMDW+xgIAAKZG2AEAAKZG2AEAAKZG2AEAAKZG2AEAAKZG2AEAAKZG2AEAAKZG2AEAAKZG2AEAAKZG2AEAAKZG2AEAAKZG2AEAAKb2/wGCKiEP57mxmgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "c = [(k, v[0]/v[1]) for k, v in correct_dict.items()]\n",
    "c.sort(key=lambda x: x[0])\n",
    "c\n",
    "plt.bar([ci[0] for ci in c], [ci[1]*100 for ci in c])\n",
    "plt.xlabel(\"Class\")\n",
    "plt.ylabel(\"Accuracy\")\n",
    "plt.xticks(ticks=[i for i in range(10)])\n",
    "for i, ci in enumerate(c):\n",
    "    plt.annotate(str(ci[1])[:5], (i-0.25, ci[1]*100 + 2))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 272,
   "id": "9ec999b4",
   "metadata": {},
   "outputs": [],
   "source": [
    "def visTensor(tensor, ch=0, allkernels=False, nrow=5, padding=1): \n",
    "    n,c,w,h = tensor.shape\n",
    "\n",
    "    if allkernels: tensor = tensor.view(n*c, -1, w, h)\n",
    "    elif c != 3: tensor = tensor[:,ch,:,:].unsqueeze(dim=1)\n",
    "\n",
    "    rows = np.min((tensor.shape[0] // nrow + 1, 64))    \n",
    "    grid = utils.make_grid(tensor, nrow=nrow, normalize=True, padding=padding)\n",
    "    plt.figure( figsize=(20,20) )\n",
    "    plt.imshow(grid.numpy().transpose((1, 2, 0)), cmap='BuPu')\n",
    "    plt.axis('off')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 273,
   "id": "09af3adb",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 2000x2000 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "kernels = model.conv_layer.weight.data.clone()\n",
    "visTensor(kernels, ch=0, allkernels=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3798fe4d",
   "metadata": {},
   "source": [
    "## New Model with MaxPool Layer and Smaller Kernel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 301,
   "id": "eebdeba2",
   "metadata": {},
   "outputs": [],
   "source": [
    "class ConvNetMaxPool(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(ConvNetMaxPool, self).__init__() #Initializing superclass\n",
    "        self.conv_layer = nn.Conv2d(in_channels=1, out_channels=10,\n",
    "                               kernel_size=5, padding=0) \n",
    "        self.relu = nn.ReLU()\n",
    "        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2)\n",
    "        self.flatten = nn.Flatten()\n",
    "        self.layer2 = nn.Linear(1210, 10)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = self.conv_layer(x)\n",
    "        x = self.relu(x)\n",
    "        x = self.maxpool(x)\n",
    "        x = self.flatten(x)\n",
    "        x = self.layer2(x)\n",
    "        out = F.log_softmax(x, dim=1)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 302,
   "id": "66965810",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0: 2.11726450920105\n",
      "1: 1.6861183643341064\n",
      "2: 1.2227104902267456\n",
      "3: 0.9150146245956421\n",
      "4: 0.7427895069122314\n",
      "5: 0.640465497970581\n",
      "6: 0.5732887983322144\n",
      "7: 0.5258785486221313\n",
      "8: 0.48998594284057617\n",
      "9: 0.4621153771877289\n",
      "10: 0.4394333064556122\n",
      "11: 0.4207530617713928\n",
      "12: 0.4047263264656067\n",
      "13: 0.39097267389297485\n",
      "14: 0.37878280878067017\n",
      "15: 0.3678332567214966\n",
      "16: 0.35841143131256104\n",
      "17: 0.34947502613067627\n",
      "18: 0.3414694368839264\n",
      "19: 0.33394911885261536\n",
      "20: 0.32722458243370056\n",
      "21: 0.3207947909832001\n",
      "22: 0.3146950304508209\n",
      "23: 0.30934005975723267\n",
      "24: 0.30379316210746765\n",
      "25: 0.2986851632595062\n",
      "26: 0.2941092252731323\n",
      "27: 0.2894502282142639\n",
      "28: 0.284914493560791\n",
      "29: 0.2809075713157654\n",
      "30: 0.2767772972583771\n",
      "31: 0.273006409406662\n",
      "32: 0.2690839171409607\n",
      "33: 0.26542696356773376\n",
      "34: 0.2620452046394348\n",
      "35: 0.25861701369285583\n",
      "36: 0.2552771270275116\n",
      "37: 0.25210562348365784\n",
      "38: 0.24906150996685028\n",
      "39: 0.24607829749584198\n",
      "40: 0.2433597594499588\n",
      "41: 0.24015021324157715\n",
      "42: 0.23767061531543732\n",
      "43: 0.2347862720489502\n",
      "44: 0.23226124048233032\n",
      "45: 0.2296268790960312\n",
      "46: 0.22714705765247345\n",
      "47: 0.22474300861358643\n",
      "48: 0.2223331779241562\n",
      "49: 0.21996645629405975\n"
     ]
    }
   ],
   "source": [
    "# Constants\n",
    "lr = 0.0025\n",
    "epochs = 50\n",
    "\n",
    "# Loading Dataset\n",
    "train_dataset = CustomMNISTDataset('./output/training/')\n",
    "train_dataloader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n",
    "\n",
    "# Initialize Model\n",
    "model = ConvNetMaxPool()\n",
    "# Initialize Optimizer\n",
    "optimizer = optim.Adadelta(model.parameters(), lr=lr)\n",
    "# Loss function\n",
    "loss_fn = nn.CrossEntropyLoss()\n",
    "\n",
    "# set model to train mode\n",
    "losses = []\n",
    "model.train()\n",
    "for epoch in range(epochs):\n",
    "\tbatch_losses = []    \n",
    "\tfor batch_idx, (data, targets) in enumerate(train_dataloader):\n",
    "\t\toptimizer.zero_grad()\n",
    "\t\toutputs = model(data)\n",
    "\t\tloss = loss_fn(outputs, targets.squeeze(1).float())\n",
    "\t\tloss.backward() # Backpropagation of loss\n",
    "\t\toptimizer.step() # Updating Weights based on Gradients\n",
    "\t\tbatch_losses.append(loss.item())\n",
    "\tfinal_epoch_loss = torch.mean(torch.Tensor(batch_losses))\n",
    "\tlosses.append(final_epoch_loss)\n",
    "\tprint(f\"{epoch}: {final_epoch_loss}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 303,
   "id": "5620c220",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.9433\n"
     ]
    }
   ],
   "source": [
    "from collections import defaultdict\n",
    "\n",
    "# Load the test data\n",
    "test_dataset = CustomMNISTDataset('./output/testing/')\n",
    "test_dataloader = DataLoader(test_dataset, batch_size=64, shuffle=True)\n",
    "\n",
    "# Set model to eval mode\n",
    "model.eval()\n",
    "\n",
    "# Loop over dataset to compute accuracy\n",
    "correct = 0\n",
    "correct_dict = defaultdict(lambda: [0,0])\n",
    "for batch_idx, (data, targets) in enumerate(test_dataloader):\n",
    "    outputs = model(data)\n",
    "    pred = outputs.argmax(dim=1, keepdim=True) \n",
    "    correct += pred.eq(targets.argmax(dim=2).view_as(pred)).sum().item()\n",
    "    for p, t in zip(pred, targets):\n",
    "        if p[0] == t.argmax():\n",
    "            correct_dict[t.argmax().item()][0] += 1\n",
    "        correct_dict[t.argmax().item()][1] += 1\n",
    "accuracy = correct / test_dataset.__len__()\n",
    "print(f\"Accuracy: {accuracy}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 304,
   "id": "dacaf074",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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wVSlN998U48//rgiIiJks9nUokULDR8+vEIjd7Vr19aaNWs0cuRINWzYUO7u7oqKilL//v3LfRXiQw89pP/85z968cUXlZWVpRtvvLHYBQ+/H5W8fMHDd999p7p16+ruu+/W22+/7XDBw5kzZzRs2DCdPn1afn5+6tChgzZu3Kg777zTvs/ChQs1depU+9e33nqrJGnZsmV69NFHy/0zqCjKDq4pZr0Tu2zdunV6+OGHdeHCBQUFBWnTpk1q1KjRVZ0LqlZVvPONjY3VypUr9dFHH8nX19c+/8fPz0/e3t5XfOzCyrdK/jda05n5ezlz5kzVqlVLo0ePrnDu6nocSkk6d+6s9PR05eTk6NKlS2rcuLG6d++uLl26lPsYzr4lxJIlS674PadMmWLKM+qYswNcQUXnYpTljjvuUHp6ur744gvdddddevDBB0udkwBzVcWl/klJScrJydHtt9/ucKPD5ORk+z48dqF8nPF7uXfvXr355ptavny5bDZbhTNU59yX0vj5+alx48Y6evSo9uzZc9XHsTpGdnBNMfOdmPTbTfuuv/56XX/99brpppvUsmVLLVmyRItyOlzV+VSla/nxHJc5+51veT9imDBhQonzVKzKrN/Lf/3rXzpz5oxCQkLs6woLC/XMM89ozpw5+v777694jKoYATx//rzDQ22PHTum9PR0NWzY0J71/fffV+PGjRUSEqKMjAyNGTNGgwcPVt++fct9/tcSRnZwTXGFd2K/5ypXKgBmMuv38pFHHin2OJTg4GCNGzfOYVJtWapiBHDPnj3q2LGj/c7b8fHx6tixo1588UX7PqdPn9YjjzyiiIgIjR49Wo888ki5Lju/VjGyg2uOGe/E8vLyNH36dN17770KCgrSjz/+qAULFujkyZN64IEHtPzt76v1ZwC4GjN+L/39/eXv7++Qo3bt2goMDFSrVq3Knd3ZI4DledzJ6NGjr2qe0bWKsoNrTlVchbBnzx7dcccd9q/j4+Ml/fZU8uXLl8vd3V2HDh3SihUr9OOPP8rf319du3bVv/71r//vCpDvq+PUAZdlxu8lrh02o7JPy7OA8j4i/mrU1Etza2rumqqm/rxrau6aip834Ki8f78Z2QEAwEIoxcUxQRkAAFgaIzsArjm88wWuLYzsAAAAS2NkBwCAEjACaB2M7AAAAEtjZAeWwjsxwPXwewmz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AMDSKDsAAMDSKDsAAMDSKDsAAMDSKDsAAMDSKDsAAMDSKDsAAMDSKDsAAMDSKDsAAMDSKDsAAMDSXLrsJCYmqmvXrvL19VWTJk00ePBgHT582GGfixcvKjY2Vv7+/qpbt66GDBmi7OxskxIDAABX49JlZ8uWLYqNjdWOHTu0adMmFRQUqG/fvsrLy7PvM3bsWH3yySd6//33tWXLFp06dUr333+/iakBAIArqWV2gLJs2LDB4evly5erSZMm2rt3r2699Vbl5ORoyZIlWrlypXr37i1JWrZsmVq3bq0dO3bopptuMiM2AABwIS49svO/cnJyJEkNGzaUJO3du1cFBQWKioqy7xMREaGQkBBt37691OPk5+crNzfXYQEAANZUY8pOUVGR4uLi1KtXL7Vr106SlJWVJQ8PD9WvX99h34CAAGVlZZV6rMTERPn5+dmXZs2aVWV0AABgohpTdmJjY3XgwAGtWrWq0sdKSEhQTk6OfTlx4oQTEgIAAFfk0nN2Lhs1apTWrVunrVu36rrrrrOvDwwM1KVLl3T27FmH0Z3s7GwFBgaWejxPT095enpWZWQAAOAiXHpkxzAMjRo1SikpKfrss88UFhbmsL1z586qXbu2UlNT7esOHz6szMxM9ejRo7rjAgAAF+TSIzuxsbFauXKlPvroI/n6+trn4fj5+cnb21t+fn4aOXKk4uPj1bBhQ9WrV09PP/20evTowZVYAABAkouXnaSkJEnS7bff7rB+2bJlevTRRyVJs2fPlpubm4YMGaL8/Hz169dPf/nLX6o5KQAAcFUuXXYMw7jiPl5eXlqwYIEWLFhQDYkAAEBN49JzdgAAACqLsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyNsgMAACyN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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "c = [(k, v[0]/v[1]) for k, v in correct_dict.items()]\n",
    "c.sort(key=lambda x: x[0])\n",
    "c\n",
    "plt.bar([ci[0] for ci in c], [ci[1]*100 for ci in c])\n",
    "plt.xlabel(\"Class\")\n",
    "plt.ylabel(\"Accuracy\")\n",
    "plt.xticks(ticks=[i for i in range(10)])\n",
    "for i, ci in enumerate(c):\n",
    "    plt.annotate(str(ci[1])[:5], (i-0.25, ci[1]*100 + 2))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 305,
   "id": "bd0c7300",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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AECMEAEAAAAAAMQIEQAAAAAAQIwQAQAAAAAAxAgRAAAAAABAjBABAAAAAADECBEAAAAAAECMEAEAAAAAAMQIEQAAAAAAQIwQAQAAAAAAxAgRAAAAAABAjBABAAAAAADECBEAAAAAAECMEAEAAAAAAMQIEQAAAAAAQIwQAQAAAAAAxAgRAAAAAABAjBABAAAAAADECBEAAAAAAECMEAEAAAAAAMQIEQAAAAAAQIwQAQAAAAAAxAgRAAAAAABAjBABAAAAAADECBEAAAAAAECMEAEAAAAAAMQIEQAAAAAAQIwQAQAAAAAAxAgRAAAAAABAjBABAAAAAADECBEAAAAAAECMEAEAAAAAAMQIEQAAAAAAQIwQAQAAAAAAxAgRAAAAAABAjBABAAAAAADECBEAAAAAAECMEAEAAAAAAMQIEQAAAAAAQIwQAQAAAAAAxAgRAAAAAABAjBABAAAAAADECBEAAAAAAECMEAEAAAAAAMQIEQAAAAAAQIwQAQAAAAAAxAgRAAAAAABAjBABAAAAAADEjF3rhRMTE8kdAAAAAADAEHIiAgAAAAAAiBEiAAAAAACAGCECAAAAAACIESIAAAAAAIAYIQIAAAAAAIgRIgAAAAAAgBghAgAAAAAAiBEiAAAAAACAGCECAAAAAACI+S9FOL5EUYUPgQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 2000x2000 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def visTensor(tensor, ch=0, allkernels=False, nrow=5, padding=1): \n",
    "    n,c,w,h = tensor.shape\n",
    "\n",
    "    if allkernels: tensor = tensor.view(n*c, -1, w, h)\n",
    "    elif c != 3: tensor = tensor[:,ch,:,:].unsqueeze(dim=1)\n",
    "\n",
    "    rows = np.min((tensor.shape[0] // nrow + 1, 64))    \n",
    "    grid = utils.make_grid(tensor, nrow=nrow, normalize=True, padding=padding)\n",
    "    plt.figure( figsize=(20,20) )\n",
    "    plt.imshow(grid.numpy().transpose((1, 2, 0)), cmap='BuPu')\n",
    "    plt.axis('off')\n",
    "    plt.show()\n",
    "    \n",
    "    \n",
    "kernels = model.conv_layer.weight.data.clone()\n",
    "visTensor(kernels, ch=0, allkernels=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "92613aa8",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "torch",
   "language": "python",
   "name": "torch"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
